﻿//cài đặt các hàm
#include"khaibao.h"
//hàm nhập mảng
// hàm nhập mảng từ bàn phím
void nhapmang(int a[], int &n)
{
	cout << "nhap so phan tu mang n : ";
	cin >> n;
	for (int i = 0; i<n; i++)
	{
		cout << "a[" << i << "] = ";
		cin >> a[i];
	}
}
//hàm nhập mảng ngẫu nhiên
void nhapngaunhien(int a[], int &n)
{
	cout << "nhap phan tu mang n:";
	cin >> n;
	for (int i = 0; i < n; i++)
		a[i] = rand() % 100 - 50;
}
//hàm xuất mảng
// hàm xuất mảng.
void xuatmang(int a[], int n)
{
	cout << "mang vua nhap la:"<<endl;
	for (int i = 0; i < n; i++)
		cout << a[i]<<"\t";
	cout << endl;
}
//hàm kiểm tra và hoán vị.
// hàm kiểm tra số nguyên tố
int ktngto(int x)
{
	if (x <= 1)
		return 0;
	for (int i = 2; i <= sqrt(x);i++)
		if (x%i == 0)
			return 0;
		return 1;
}
// hàm kiểm tra số hoàn thiện.
int kththien(int x)
{
	int s = 0;
	for (int i = 1; i < x;i++)
	if (x%i == 0)
		s = s + i;
	if (s == x)
		return 1;
	else
		return 0;
}
// hàm kiểm tra số chính phương.
int ktschphuong(int x)
{
	if (x == int(sqrt(x))*int(sqrt(x)))
		return 1;
	else
		return 0;
}
//hàm hoán vị.
void hoanvi(int &b, int &c)
{
	int tam = b;
	b = c;
	c = tam;
}
//hàm tìm kiếm
// hàm tìm kiếm số dương
void timduong(int a[], int n)
{
	for (int i = 0; i < n; i++)
		if (a[i]>0)
			cout << a[i] << "\t";
}
// hàm tìm kiếm số âm
void timam(int a[], int n)
{
	for (int i = 0; i < n; i++)
		if (a[i]<0)
			cout << a[i] << "\t";
}
// hàm tìm kiếm số chẵn
void timchan(int a[], int n)
{
	for (int i = 0; i < n; i++)
		if (a[i] % 2 == 0)
			cout << a[i] << "\t";
}
// hàm tìm kiếm số lẻ
void timle(int a[], int n)
{
	for (int i = 0; i < n; i++)
		if (a[i] % 2 != 0)
			cout << a[i] << "\t";
}
// hàm tìm số nguyên tố.
void timngto(int a[], int n)
{
	for (int i = 0; i < n; i++)
		if (ktngto(a[i]) == 1)
			cout << a[i] << "\t";
}
// hàm tìm số hoàn thiện.
void timhthien(int a[], int n)
{
	for (int i = 0; i < n; i++)
		if (kththien(a[i]) == 1)
			cout << a[i] << "\t";
}
// hàm tìm số chính phương.
void timchphuong(int a[], int n)
{
	for (int i = 0; i < n; i++)
		if (ktschphuong(a[i]) == 1)
			cout << a[i] << "\t";
}
// hàm tìm số chia hết cho 2 và không chia hết cho 3.
void timchiahetkhongchiahet(int a[], int n)
{
	for (int i = 0; i < n; i++)
		if ((a[i] % 2 == 0) && (a[i] % 3 != 0))
			cout << a[i] << "\t";
}
//hàm đếm
//hàm đếm số dương
int demduong(int a[], int n)
{
	int dem = 0;
	for (int i = 0; i < n; i++)
	if (a[i]>0)
		dem++;
	return dem;
}
//hàm đếm số âm
int demam(int a[], int n)
{
	int dem = 0;
	for (int i = 0; i < n; i++)
	if (a[i]<0)
		dem++;
	return dem;
}
//hàm đếm số chẵn
int demchan(int a[], int n)
{
	int dem = 0;
	for (int i = 0; i < n; i++)
	if (a[i] % 2 == 0)
		dem++;
	return dem;
}
//hàm đếm số lẻ
int demle(int a[], int n)
{
	int dem = 0;
	for (int i = 0; i < n; i++)
	if (a[i] % 2 != 0)
		dem++;
	return dem;
}
//hàm đếm số nguyên tố
int demngto(int a[], int n)
{
	int dem = 0;
	for (int i = 0; i < n; i++)
	if (ktngto(a[i]) == 1)
		dem++;
	return dem;
}
//hàm đếm số hoàn thiện
int demhthien(int a[], int n)
{
	int dem = 0;
	for (int i = 0; i < n; i++)
	if (kththien(a[i]) == 1)
		dem++;
	return dem;
}
//hàm đếm số chính phương
int demchphuong(int a[], int n)
{
	int dem = 0;
	for (int i = 0; i < n; i++)
	if (ktschphuong(a[i])==1)
		dem++;
	return dem;
}
//hàm đếm số chia hết cho 2 và không chia hết cho 3
int demchiahetkhongchiahet(int a[], int n)
{
	int dem = 0;
	for (int i = 0; i < n; i++)
		if ((a[i] % 2 == 0) && (a[i] % 3 != 0))
			dem++;
	return dem;
}
//hàm tính tổng
//hàm tính tổng các số dương
long tongduong(int a[], int n)
{
	long tong = 0;
	for (int i = 0; i < n; i++)
	if (a[i]>0)
		tong = tong + a[i];
	return tong;
}
//hàm tính tổng các số âm
long tongam(int a[], int n)
{
	long tong = 0;
	for (int i = 0; i < n; i++)
	if (a[i]<0)
		tong = tong + a[i];
	return tong;
}
//hàm tính tổng các số chẵn
long tongchan(int a[], int n)
{
	long tong = 0;
	for (int i = 0; i < n; i++)
	if (a[i] % 2 == 0)
		tong = tong + a[i];
	return tong;
}
//hàm tính tổng các số lẻ
long tongle(int a[], int n)
{
	long tong = 0;
	for (int i = 0; i < n; i++)
	if (a[i] % 2 != 0)
		tong = tong + a[i];
	return tong;
}
//hàm tính tổng các số nguyên tố
long tongngto(int a[], int n)
{
	long tong = 0;
	for (int i = 0; i < n; i++)
	if (ktngto(a[i]) == 1)
		tong = tong + a[i];
	return tong;
}
//hàm tính tổng các số hoàn thiện
long tonghthien(int a[], int n)
{
	long tong = 0;
	for (int i = 0; i < n; i++)
	if (kththien(a[i])==1)
		tong = tong + a[i];
	return tong;
}
//hàm tính tổng các số chính phương
long tongchphuong(int a[], int n)
{
	long tong = 0;
	for (int i = 0; i < n; i++)
	if (ktschphuong(a[i]) == 1)
		tong = tong + a[i];
	return tong;
}
//hàm tính tổng các số chia hết cho 2 và không chia hết cho 3
long tongchiahetkhongchiahet(int a[], int n)
{
	long tong = 0;
	for (int i = 0; i < n; i++)
	if ((a[i] % 2 == 0) && (a[i] % 3 != 0))
		tong = tong + a[i];
	return tong;
}
//hàm tính trung bình cộng
//hàm tính trung bình cộng các số dương
float tbcduong(int a[], int n)
{
	float tbc;
	long tong = 0;
	int dem = 0;
	for (int i = 0; i < n; i++)
	if (a[i]>0)
	{
		tong = tong + a[i];
		dem++;
	}
	if (dem>0)
		tbc = float(tong) / dem;
	return tbc;
}
//hàm tính trung bình cộng các số âm
float tbcam(int a[], int n)
{
	float tbc;
	long tong = 0;
	int dem = 0;
	for (int i = 0; i < n; i++)
	if (a[i]<0)
	{
		tong = tong + a[i];
		dem++;
	}
	if (dem>0)
		tbc = float(tong) / dem;
	return tbc;
}
//hàm tính trung bình cộng các số chẵn
float tbcchan(int a[], int n)
{
	float tbc;
	long tong = 0;
	int dem = 0;
	for (int i = 0; i < n; i++)
	if (a[i] % 2 == 0)
	{
		tong = tong + a[i];
		dem++;
	}
	if (dem>0)
		tbc = float(tong) / dem;
	return tbc;
}
//hàm tính trung bình cộng các số lẻ
float tbcle(int a[], int n)
{
	float tbc;
	long tong = 0;
	int dem = 0;
	for (int i = 0; i < n; i++)
	if (a[i] % 2 != 0)
	{
		tong = tong + a[i];
		dem++;
	}
	if (dem>0)
		tbc = float(tong) / dem;
	return tbc;
}
//hàm tính trung bình cộng các số nguyên tố
float tbcngto(int a[], int n)
{
	float tbc;
	long tong = 0;
	int dem = 0;
	for (int i = 0; i < n; i++)
	if (ktngto(a[i]) == 1)
	{
		tong = tong + a[i];
		dem++;
	}
	if (dem>0)
		tbc = float(tong / dem);
	return tbc;
}
//hàm tính trung bình cộng các số hoàn thiện
float tbchthien(int a[], int n)
{
	float tbc;
	long tong = 0;
	int dem = 0;
	for (int i = 0; i < n; i++)
	if (kththien(a[i]) == 1)
	{
		tong = tong + a[i];
		dem++;
	}
	if (dem>0)
		tbc = float(tong / dem);

	return tbc;
}
//hàm tính trung bình cộng các số chính phương
float tbcchphuong(int a[], int n)

{
	float tbc;
	long tong = 0;
	int dem = 0;
	for (int i = 0; i < n; i++)
	if (ktschphuong(a[i]) == 1)
	{
		tong = tong + a[i];
		dem++;
	}
	if (dem>0)
		tbc = float(tong / dem);
	return tbc;
}
//hàm tính trung bình cộng các số chia hết cho 2 và không chia hết cho 3
float tbcchiahetkhongchiahet(int a[], int n)
{
	float tbc;
	long tong = 0;
	int dem = 0;
	for (int i = 0; i < n; i++)
		if ((a[i] % 2 == 0) && (a[i] % 3 != 0))
		{
			tong = tong + a[i];
			dem++;
		}
	if (dem>0)
		tbc = float(tong) / dem;
	return tbc;
}
//hàm sắp xếp
//hàm sắp xếp tăng dần cả mảng
void sapxeptang(int a[], int n)
{
	for (int i = 0; i < n - 1; i++)
		for (int j = i + 1; j < n; j++)
			if (a[i]>a[j])
				hoanvi(a[i], a[j]);
			xuatmang(a, n);
}
//hàm sắp xếp tăng dần các số dương
void sxduongtang(int a[], int n)
{
	for (int i = 0; i < n - 1; i++)
		for (int j = i + 1; j < n; j++)
			if ((a[i]>a[j]) && (a[i]>0) && (a[j]>0))
				hoanvi(a[i], a[j]);
			xuatmang(a, n);
}
//hàm sắp xếp tăng dần các số âm
void sxamtang(int a[], int n)
{
	for (int i = 0; i < n - 1; i++)
		for (int j = i + 1; j < n; j++)
			if ((a[i]>a[j]) && (a[i]<0) && (a[j]<0))
				hoanvi(a[i], a[j]);
			xuatmang(a, n);
}
//hàm sắp xếp tăng dần các số chẵn
void sxchantang(int a[], int n)
{
	for (int i = 0; i < n - 1; i++)
		for (int j = i + 1; j < n; j++)
			if ((a[i]>a[j]) && (a[i]%2==0) && (a[j]%2==0))
				hoanvi(a[i], a[j]);
			xuatmang(a, n);
}
//hàm sắp xếp tăng dần các số lẻ
void sxletang(int a[], int n)
{
	for (int i = 0; i < n - 1; i++)
		for (int j = i + 1; j < n; j++)
			if ((a[i]>a[j]) && (a[i]%2!=0) && (a[j]%2!=0))
				hoanvi(a[i], a[j]);
			xuatmang(a, n);
}
//hàm sắp xếp tăng dần các số nguyên tố
void sxngtotang(int a[], int n)
{
	for (int i = 0; i < n - 1; i++)
		for (int j = i + 1; j < n; j++)
			if ((ktngto(a[i]) == 1) && (ktngto(a[j]) == 1) && (a[i]>a[j]))
				hoanvi(a[i], a[j]);
			xuatmang(a, n);
}
//hàm sắp xếp tăng dần các số hoàn thiện
void sxhthientang(int a[], int n)
{
	for (int i = 0; i < n - 1; i++)
		for (int j = i + 1; j < n; j++)
			if ((kththien(a[i]) == 1) && (kththien(a[j]) == 1) && (a[i]>a[j]))
				hoanvi(a[i], a[j]);
			xuatmang(a, n);
}
//hàm sắp xếp tăng dần các số chính phương
void sxchphuongtang(int a[], int n)
{
	for (int i = 0; i < n - 1; i++)
		for (int j = i + 1; j < n; j++)
			if ((ktschphuong(a[i]) == 1) && (ktschphuong(a[j]) == 1) && (a[i]>a[j]))
				hoanvi(a[i], a[j]);
			xuatmang(a, n);
}
//hàm sắp xếp tăng dần các số chia hết cho 2 và không chia hết cho 3
void sxchiahetvakhongchiahettang(int a[], int n)
{
	for (int i = 0; i < n - 1; i++)
		for (int j = i + 1; j < n; j++)
			if ((a[i] % 2 == 0) && (a[j] % 2 != 3) && (a[i]>a[j]))
				hoanvi(a[i], a[j]);
			xuatmang(a, n);
}
//hàm sắp xếp giảm dần
//hàm sắp xếp giảm dần trên cả mảng.
void sapxepgiam(int a[], int n)
{
	for (int i = 0; i < n - 1; i++)
		for (int j = i + 1; j < n; j++)
			if (a[i]<a[j]) 
				hoanvi(a[i], a[j]);
			xuatmang(a, n);
}
//hàm sắp xếp giảm dần các số dương
void sxduonggiam(int a[], int n)
{
	for (int i = 0; i < n-1; i++)
		for (int j = i + 1; j < n; j++)
			if ((a[i]<a[j]) && (a[i]>0) && (a[j]>0))
				hoanvi(a[i], a[j]);
			xuatmang(a, n);
}
//hàm sắp xếp giảm dần các số âm
void sxamgiam(int a[], int n)
{
	for (int i = 0; i < n - 1; i++)
		for (int j = i + 1; j < n; j++)
			if ((a[i]<a[j]) && (a[i]<0) && (a[j]<0))
				hoanvi(a[i], a[j]);
			xuatmang(a, n);
}
//hàm sắp xếp giảm dần các số chẵn
void sxchangiam(int a[], int n)
{
	for (int i = 0; i < n - 1; i++)
		for (int j = i + 1; j < n; j++)
			if ((a[i]<a[j]) && (a[i]%2==0) && (a[j]%2==0))
				hoanvi(a[i], a[j]);
			xuatmang(a, n);
}
//hàm sắp xếp giảm dần các số lẻ
void sxlegiam(int a[], int n)
{
	for (int i = 0; i < n - 1; i++)
		for (int j = i + 1; j < n; j++)
			if ((a[i]<a[j]) && (a[i]%2!=0) && (a[j]%2!=0))
				hoanvi(a[i], a[j]);
			xuatmang(a, n);
}
//hàm sắp xếp giảm dần các số nguyên tố
void sxngtogiam(int a[], int n)
{
	for (int i = 0; i < n-1; i++)
		for (int j = i + 1; j < n; j++)
			if ((ktngto(a[i]) == 1) && (ktngto(a[j]) == 1) && (a[i]<a[j]))
				hoanvi(a[i], a[j]);
			xuatmang(a, n);
}
//hàm sắp xếp giảm dần các số hoàn thiện
void sxhthiengiam(int a[], int n)
{
	for (int i = 0; i < n-1; i++)
		for (int j = i + 1; j < n; j++)
			if ((kththien(a[i]) == 1) && (kththien(a[j]) == 1) && (a[i]<a[j]))
				hoanvi(a[i], a[j]);
			xuatmang(a, n);
}
//hàm sắp xếp giảm dần các số chính phương
void sxchphuonggiam(int a[], int n)
{
	for (int i = 0; i < n-1; i++)
		for (int j = i + 1; j < n; j++)
			if ((ktschphuong(a[i]) == 1) && (ktschphuong(a[j]) == 1) && (a[i]<a[j]))
				hoanvi(a[i], a[j]);
			xuatmang(a, n);
}
//hàm sắp xếp giam dần các số chia hết cho 2 và không chia hết cho 3
void sxchiahetvakhongchiahetgiam(int a[], int n)
{
	for (int i = 0; i < n-1; i++)
		for (int j = i + 1; j < n; j++)
			if ((a[i] % 2 == 0) && (a[j] % 2 != 3) && (a[i]<a[j]))
				hoanvi(a[i], a[j]);
			xuatmang(a, n);
}
//ham ghi tep tin
void Ghifile(char tenfile[], int a[],int &n)
{
	ofstream fout(tenfile, ios::out);
	if (!fout)
	{
		cout << ("\n khong mo duoc file:");
		exit(1);
	}
	fout << n << endl;
	for (int i = 0; i < n; i++)
	{
		fout << a[i] << "\t";
	}
	fout.close();
}
//ham doc tep tin
void docfile(char tenfile[], int a[], int &n)
{
	fstream fin(tenfile, ios::in);
	if (!fin.is_open())
		cout << "khong the mo file";
	while (1)
	{
		fin >> n;

		cout << n;
		cout << endl;
		for (int i = 0; i < n; i++)
		{
			fin >> a[i];
			cout << a[i] << "\t";
		}
		cout << "\n";
		break;
	}
	fin.close();
}